<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>Document</title>
  </head>

  <body>
    <script>
      class SuperType {
        count = 0;//实例属性
        obj = {z:5};//实例属性
        constructor(x, y) {
          this.x = x;//实例属性
          this.y = y;//实例属性
          //思考：下边的f是实例自身的方法，还是共享的原型方法？这样写是否合理，分析一下内存情况
          this.f = function(){console.log("f")};
        }

        //原型方法（不同实例对象会共享）
        say() {
          console.log(this.count);
        }

        //静态方法，属于类
        static hello() {
          console.log('hello',this);//这里的this指的是什么?
          // console.log(this===SuperType);//返回true还是false
        }
      }
      SuperType.world = 'hello world';//静态属性，属于类

      let s1 = new SuperType(1, 2);
      // console.dir(s1);
      s1.say(); //原型方法
      SuperType.hello(); //静态方法
      console.log(SuperType.world); //静态属性

      let s2 = new SuperType(3, 4);
      console.log(s1.obj === s2.obj);//返回false，说明是各自实例对象自有的属性，不是共享的原型属性
      console.log(s1.count === s2.count);//返回true还是false，理解值比较和引用比较的区别
      
      console.log(s1.say === s2.say);//返回true，说明是共享的原型方法
      console.log(s1.f === s2.f);//返回什么？

      //思考：若是要定义原型属性（不是原型方法），应该怎么定义
      SuperType.prototype.m = {w:2};//通过SuperType.prototype来添加，共享的原型属性
      console.log(s1.m === s2.m);//返回为true，因为原型属性是共享的
    </script>
  </body>
</html>
